package xlog

import (
	"fmt"
	"time"
)

// 日志迁移表信息
func LogMigration() {
	if _default.DB == nil {
		Panic("数据库未连接导致迁移失败", nil)
		return
	}
	stat := 0
	// 查询超出日期的日志列表
	logs := []LogStruct{}
	err := _default.DB.Table(_default.TableName).
		Where("created_at < ?", time.Now().Add(-1*time.Hour*24*time.Duration(_default.MaxTimes)).Format(time.DateTime)).
		Order("id ASC").
		Limit(int(_default.MaxMigrationLimit)).
		Find(&logs).
		Error
	if err != nil {
		Alert("迁移数据库错误", err)
		return
	}
	// 将日志插入到新的日志表中
	for i := 0; i < len(logs); i++ {
		id := logs[i].Id
		logs[i].Id = 0 // 使用自动生成的ID，避免id重复
		err = _default.DB.Table(_default.OldTableName).Create(&logs[i]).Error
		if err != nil {
			Alert("迁移数据库时插入错误", err)
			continue
		}
		// 执行原数据删除操作
		err = _default.DB.Table(_default.TableName).Where("id", id).Delete(&LogStruct{}).Error
		if err != nil {
			Alert("迁移数据库时删除错误", err)
		}
		stat++
	}
	// 迁移函数执行时长的日志
	funs := []FuncLog{}
	err = _default.DB.Table(_default.FuncLogName).
		Where("created_at < ?", time.Now().Add(-1*time.Hour*24*time.Duration(_default.MaxTimes)).Format(time.DateTime)).
		Order("id ASC").
		Limit(int(_default.MaxMigrationLimit)).
		Find(&funs).
		Error
	if err != nil {
		Alert("迁移函数数据库错误", err)
		return
	}
	// 将日志插入到新的日志表中
	for i := 0; i < len(funs); i++ {
		id := funs[i].Id
		funs[i].Id = 0 // 使用自动生成的ID，避免id重复
		err = _default.DB.Table(_default.OldFuncLogName).Create(&funs[i]).Error
		if err != nil {
			Alert("迁移函数数据库时插入错误", err)
			continue
		}
		// 执行原数据删除操作
		err = _default.DB.Table(_default.FuncLogName).Where("id", id).Delete(&FuncLog{}).Error
		if err != nil {
			Alert("迁移函数数据库时删除错误", err)
		}
		stat++
	}
	// 迁移https请求日志
	quest := []QuestStruct{}
	err = _default.DB.Table(_default.QuestName).
		Where("start_time < ?", time.Now().Add(-1*time.Hour*24*time.Duration(_default.MaxTimes)).Format(time.DateTime)).
		Order("id ASC").
		Limit(int(_default.MaxMigrationLimit)).
		Find(&quest).
		Error
	if err != nil {
		Alert("迁移函数数据库错误", err)
		return
	}
	// 将日志插入到新的日志表中
	for i := 0; i < len(quest); i++ {
		id := quest[i].Id
		quest[i].Id = 0 // 使用自动生成的ID，避免id重复
		err = _default.DB.Table(_default.OldQuestName).Create(&quest[i]).Error
		if err != nil {
			Alert("迁移函数数据库时插入错误", err)
			continue
		}
		// 执行原数据删除操作
		err = _default.DB.Table(_default.QuestName).Where("id", id).Delete(&QuestStruct{}).Error
		if err != nil {
			Alert("迁移函数数据库时删除错误", err)
		}
		stat++
	}
	// 迁移完成后整理数据表信息
	_default.DB.Exec(fmt.Sprintf("OPTIMIZE TABLE `%s`", _default.TableName))
	_default.DB.Exec(fmt.Sprintf("OPTIMIZE TABLE `%s`", _default.QuestName))
	_default.DB.Exec(fmt.Sprintf("OPTIMIZE TABLE `%s`", _default.FuncLogName))
	if stat > 0 {
		Notice(fmt.Sprintf("日志迁移完成，共迁移了 %d 条日志记录，数据库所用存储空间已重新整理", stat))
	}
}
